// 1.数学方法
a = 3.15
    // Math本身就是一个对象, 不需要在通过构造函数去创建, 该对象中集合了很多关于数学运算的方法
    // 1、只保留正数部分：parselnt 
    // console.log(parseInt(a))
    // 2、向上取整，有小数就整数部分加1：Math.ceil 
    // console.log(Math.ceil(a));
    // 3、四舍五入： Math.round 
    // console.log(Math.round(a));
    // 4、向下取整： Math.floor 
    // console.log(Math.floor(a));
    // 5、获取一个对象的绝对值：Math.abs 
    // console.log(Math.abs(-a));
    // 6. π：Math.PI 
    // console.log(Math.PI);
    // 7、求几个数的最大数：Math.max() 
    // console.log(Math.max(1, 2, 3, -10));
    // 8、求几个树的最小树：Math.min 
    // console.log(Math.min(1, 2, 3, -10));
    // 9、随机数 (随机生成0 ~1之间的数)：Math.random
    // console.log(Math.random());

// 2.字符串方法
str = "abc-def-ghi-jkl-mn     "
    // 1、返回指定索引的字符：charAt
    // console.log(str.charAt(5));
    // 2、字符串拼接：concat 
    // console.log(str.concat("123"));
    // console.log(str);
    // 3.取从第几位到指定长度的字符串：substr 
    // console.log(str.substr(3, 5));
    // console.log(str);
    // 4.取介于两个指定下标之间的字符串：substring 
    // console.log(str.substring(3, 5));
    // console.log(str);
    // 5.返回一个新的数组,介于两个指定下标之间的字符串：slice
    // arr = str.slice(0, 5);
    // console.log(arr);
    // console.log(str);
    // 6.返回子字符串的位置(没有找到返回-1)：首次的位置：IndexOf、最后的位置：lastIndexOf 
    // console.log(str.indexOf("a"));
    // console.log(str.lastIndexOf("a"));
    // 7、删除头尾的空格：trim() 
    // console.log(str.trim());
    // 8.检索指定的值：match() 
    // console.log(str.match("mn"));
    // 9.返回指定的第一个匹配项的索引(未检测到返回-1)：search() 
    // console.log(str.search("abc"));
    // 10.替换现有字符串：.replace() 替换后返回新的字符串(数组)，原字符串(数组)不变
    // ret = str.replace("abc", "123")
    // console.log(ret, str);
    // 11.把字符串分割成字符串数组：split(分隔符) 
    // console.log(str.split('-'), str);


// 3、数组相关
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 4]
    // 1、返回原数组指定两个下标之间的新数组：slice() 
    // newArr = arr.slice(1, 4)
    // console.log(newArr, arr);
    // 2、(改变原数组删除) 插入 替换数组 【参数不同】 ：splice()   array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
    // newArr1 = arr.splice(0, 0, "aaa")
    // newArr2 = arr.splice(1, 1, "bb")
    // console.log(newArr1, newArr2, arr);
    // 3、将参数添加到数组的最后，返回新数组的长度：push() 
    // arr.push("push")
    // console.log(arr);
    // 4.(改变原数组)删除数组的最后一个元素，返回被删除的值(减少数组的长度)：pop() 
    // ret = arr.pop()
    // console.log(ret, arr);
    // 5.向数组的开头添加一个或多个的元素，并返回新的长度：unshift() 
    // ret = arr.unshift("aaa")
    // console.log(ret, arr);
    // 6.删除数组的第一个参数，数组的长度减1：shift() 
    // ret = arr.shift()
    // console.log(ret, arr);
    // 7.按指定的参数对数组进行排序，返回的值是经过排序后的数组： sort() 
    // newArr = arr.sort()
    // console.log(newArr, arr);
    // 8.将数组中的元素进行反转，倒序显示：reverse() 
    // newArr = arr.reverse()
    // console.log(newArr, arr);
    // 9.用分隔符将数组的元素组成一个字符串：join() 
    // ret = arr.join("-")
    // console.log(ret, arr);
    // 10、从数组的开头向后查找，（接受两个参数，要查找的项和查找起点的位置索引）：indexOf() 
    // ret = arr.indexOf("a", 0)
    // console.log(ret, arr);
    // 11、从数组末尾开始获取：lastIndexof() 
    // ret = arr.lastIndexOf("a", 11)
    // console.log(ret, arr);
    // 12、遍历数组：for 
    // for (let i = 0; i < arr.length; i++) {
    //     console.log(arr[i]);
    // }
    // 13、对数组的每个元素执行一次提供的函数：foeEach() 
    // arr.forEach((val, key) => {
    //     console.log(val, key);
    // });
    // 15、方法创建一个新数组，这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成：map() 
    // newArr = arr.map(x => x * 2)
    // console.log(newArr, arr);

// 16.通过检查指定数组中符合条件的所有元素（不会改变原始数组）：filter() 
// 17.把数组转换成字符串，每一项用,分割：toString() 
// 18.every和some every 是所有函数的每个回调都返回 true 的时候才会返回 true，当遇到 false 的时候终止执行，返回 false。 some 函数是存在有一个函数返回 true 的时候终止执行并返回 true，否则返回 false。 
// 19.reduce(function(v1,v2),value) 和 reduceRight(functio(v1,v2),value) 遍历数组，调用回调函数，将数组元素组合成一个值，reduce 从索引最小值开始，reduceRight 反向，方法有两个参数（回调函数，把两个值合成一个，返回结果；value,一个初始值，可选） 
// 20.判断一个对象是否为数组：isArray()

// 4、JS获取DOM元素的方法
// 注意：原生JS选取DOM元素比使用Jquery类库选取要快很多
// ID:document.getElementById('myid'); 
// class：document.getElementsByClassName('myclass')[0]; 
// TagName：document.getElementsByTagName('mydiv')[0]; 
// 标签：document.getElementsByName('myname')[0];

// JS修改CSS样式
// document.getElementById('myid').style.display = 'none';
// JS修改CLASS属性 一个class属性：document.getElementById('myid').className = 'active'; 
// 多个class用空格分开：document.getElementById('myid').className = 'active div-1'; 
// 改元素的所有class属性 使用空格：document.getElementById('myid').className = '';
// JS修改文本： document.getElementById('myid').innerHTML = '123';

// js创建元素并向其中追加文本
// var newdiv = document.createElement('div'); 
// var newtext = document.createTextNode('123'); 
// newdiv.appendChild(newtext); 
// document.body.appendChild(newdiv);
// 同理：removeChild()移除节点，并返回节点
// cloneNode() 复制节点 insertBefore() 插入节点（父节点内容的最前面）
// 注意：insertBefore() 有两个参数，第一个是插入的节点，第二个是插入的位置

// 5、追加元素的几种方法
// 1.在父级最前面追加一个子元素：prepend()
// 2.在父级最后面追加一个子元素：append() 
// 3.将子元素追加到父级的最前面：prependTo() 
// 4.将子元素追加到父级的最后：appendTo() 
// 5.在当前元素之前追加（是同级关系）：before() 
// 6.在当前元素之后追加（是同级关系）：after() 
// 7.将元素追加到指定对象的前面（是同级关系）：insertBefore() 
// 8.将元素追加到指定对象的后面（是同级关系）：insertAfter() 
// 9.在节点的最后追加子元素：appendChild()

// 6、JS返回所有子节点对象childNodes
// firstChild 返回第一个子节点 
// lastChild 返回最后一个子节点 
// parentNode 返回父节点对象 
// nextSibling 返回下一个兄弟节点对象 
// previousSibling 返回前一个兄弟节点对象 
// nodeName 返回节点的HTML标记名称
// var mylist = document.getElementById('myid');
// for(var i=0,i<mylist.childNodes.length;i++){
//   console.log(mylist.childNodes[i]);
// }

// 7、对象Object构造方法
// Object.assign()将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。 
// Object.create()用指定的原型对象和属性创建一个新对象。 
// Object.defineProperty()将给定描述符描述的命名属性添加到对象。 
// Object.defineProperties()将给定描述符描述的命名属性添加到对象。 
// Object.entries()返回一个包含[key, value]给定对象自己的可枚举字符串属性的所有对的数组。 
// Object.freeze()冻结对象。其他代码无法删除或更改其属性。 
// Object.fromEntries()从可迭代的[key, value]对中返回一个新对象。（这是的反向 Object.entries）。
// Object.getOwnPropertyDescriptor()返回对象的命名属性的属性描述符。 
// Object.getOwnPropertyDescriptors()返回一个包含对象自身所有属性描述符的对象。 
// Object.getOwnPropertyNames()返回一个数组，其中包含给定对象自己的所有可枚举和不可枚举属性的名称。 
// Object.getOwnPropertySymbols()返回直接在给定对象上找到的所有符号属性的数组。 
// Object.getPrototypeOf()返回prototype指定对象的。 
// Object.is()比较两个值是否相同。求所有NaN值（不同于“抽象相等比较”和“严格相等比较”）。
// Object.isExtensible()确定是否允许扩展对象。 
// Object.isFrozen()确定对象是否冻结。 
// Object.isSealed()确定对象是否密封。 
// Object.keys()返回一个数组，其中包含给定对象自己的所有可枚举字符串属性的名称。 
// Object.preventExtensions()防止对象的任何扩展。 
// Object.seal()防止其他代码删除对象的属性。 
// Object.setPrototypeOf()设置对象的原型（其内部[[Prototype]]属性）。 
// Object.values()返回一个数组，该数组包含与给定对象自己的所有可枚举字符串属性相对应的值。
function guid() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random() * 16 | 0,
            v = c == 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
}
console.log(guid());
// "a1ca0f7b-51bd-4bf3-a5d5-6a74f6adc1c7"